﻿<!--Copyright (c) 2016
//    Isura Edirisinghe

//        Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

//The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.-->

<ResourceDictionary
	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero">

	<ResourceDictionary.MergedDictionaries>
		<ResourceDictionary Source="Brushes.xaml"/>
	</ResourceDictionary.MergedDictionaries>

	<!-- Value converters -->
	<BooleanToVisibilityConverter x:Key="bool2VisibilityConverter" />
	
	<!-- DataGridColumnHeader Right Gripper Style -->
	<Style x:Key="ColumnHeaderRightGripperStyle" TargetType="{x:Type Thumb}">
		<Setter Property="Width" Value="8"/>
		<Setter Property="Background" Value="Transparent"/>
		<Setter Property="Cursor" Value="SizeWE"/>
		<Setter Property="Template">
			<Setter.Value>
				<ControlTemplate TargetType="{x:Type Thumb}">
					<Border Padding="{TemplateBinding Padding}"
							Background="{TemplateBinding Background}">
					</Border>
				</ControlTemplate>
			</Setter.Value>
		</Setter>
	</Style>
	<!-- DataGridColumnHeader Left Gripper Style -->
	<Style x:Key="ColumnHeaderLeftGripperStyle" 
		   BasedOn="{StaticResource ColumnHeaderRightGripperStyle}" 
		   TargetType="{x:Type Thumb}">
		<Setter Property="Width" Value="8"/>
		<Setter Property="Background" Value="Transparent"/>
		<Setter Property="Cursor" Value="SizeWE"/>
		<Setter Property="Template">
			<Setter.Value>
				<ControlTemplate TargetType="{x:Type Thumb}">
					<Border Name="Border"
							Padding="{TemplateBinding Padding}" 
							Background="{TemplateBinding Background}">
						<Canvas>
							<Line RenderOptions.EdgeMode="Aliased" Stroke="#88B0E4"
								  X1="7" Y1="{Binding ElementName=Border, Path=ActualHeight}"
								  X2="7" Y2="0"/>
						</Canvas>
					</Border>
				</ControlTemplate>
			</Setter.Value>
		</Setter>
	</Style>
	<!-- DataGridColumnHeader Style -->
	<Style x:Key="ColumnHeaderStyle" TargetType="{x:Type DataGridColumnHeader}">
		<Setter Property="VerticalContentAlignment" Value="Center" />
		<Setter Property="Background" Value="{StaticResource HeaderBackgroundBrush}"/>
		<Setter Property="BorderBrush" Value="{StaticResource HeaderBorderBrush}" />
		<Setter Property="BorderThickness" Value="0,1,0,1" />
		<Setter Property="Template">
			<Setter.Value>
				<ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
					<Grid>
						<Themes:DataGridHeaderBorder
							x:Name="headerBorder"
							SortDirection="{TemplateBinding SortDirection}"
							IsHovered="{TemplateBinding IsMouseOver}"
							IsPressed="{TemplateBinding IsPressed}"
							IsClickable="{TemplateBinding CanUserSort}"
							Background="{TemplateBinding Background}"
							BorderBrush="{TemplateBinding BorderBrush}"
							BorderThickness="{TemplateBinding BorderThickness}"
							Padding ="{TemplateBinding Padding}"
							SeparatorVisibility="{TemplateBinding SeparatorVisibility}"
							SeparatorBrush="{TemplateBinding SeparatorBrush}">
							<Border BorderBrush="{StaticResource HeaderInnerBorderBrush}" 
									BorderThickness="0,1,0,0">
								<TextBlock
									Text="{Binding}" Margin="4,0,4,0"
									SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
									VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
									HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" />
							</Border>
						</Themes:DataGridHeaderBorder>

						<Thumb x:Name="PART_LeftHeaderGripper"
							   HorizontalAlignment="Left"
							   Style="{StaticResource ColumnHeaderRightGripperStyle}"/>
						<Thumb x:Name="PART_RightHeaderGripper"
							   HorizontalAlignment="Right"
							   Style="{StaticResource ColumnHeaderLeftGripperStyle}"/>
					</Grid>
					<ControlTemplate.Triggers>
						<Trigger Property="IsMouseOver" Value="True">
							<Setter TargetName="headerBorder" Property="Background" 
									Value="{StaticResource HeaderHighlightedBackgoundBrush}" />
						</Trigger>
						<Trigger Property="IsPressed" Value="True">
							<Setter TargetName="headerBorder" Property="Background" 
									Value="{StaticResource HeaderPressedBackgroundBrush}" />
						</Trigger>
					</ControlTemplate.Triggers>
				</ControlTemplate>
			</Setter.Value>
		</Setter>
	</Style>
	
	<!-- DataGridRowHeader Gripper -->
	<Style x:Key="RowHeaderGripperStyle" TargetType="{x:Type Thumb}">
		<Setter Property="Height" Value="8"/>
		<Setter Property="Background" Value="Transparent"/>
		<Setter Property="Cursor" Value="SizeNS"/>
		<Setter Property="Template">
			<Setter.Value>
				<ControlTemplate TargetType="{x:Type Thumb}">
					<Border Padding="{TemplateBinding Padding}"
							Background="{TemplateBinding Background}"/>
				</ControlTemplate>
			</Setter.Value>
		</Setter>
	</Style>
	<!-- DataGridRowHeader Style -->
	<Style x:Key="{x:Type DataGridRowHeader}"
		   TargetType="{x:Type DataGridRowHeader}">
		<Setter Property="Background" Value="{StaticResource HeaderBackgroundBrush}" />
		<Setter Property="BorderBrush" Value="{StaticResource HeaderBorderBrush}" />
		<Setter Property="Template">
			<Setter.Value>
				<ControlTemplate TargetType="{x:Type DataGridRowHeader}">
					<Grid>
						<Themes:DataGridHeaderBorder 
							x:Name="headerBorder"
							IsSelected="{TemplateBinding IsRowSelected}"
							IsHovered ="{TemplateBinding IsMouseOver}"
							IsPressed="{TemplateBinding IsPressed}"
							Background="{TemplateBinding Background}"
							BorderBrush="{TemplateBinding BorderBrush}"
							BorderThickness="1,0,1,1"
							Padding ="{TemplateBinding Padding}"
							Orientation="Horizontal"
							SeparatorVisibility="{TemplateBinding SeparatorVisibility}"
							SeparatorBrush="{TemplateBinding SeparatorBrush}">
							<Border BorderBrush="{StaticResource HeaderInnerBorderBrush}"
									BorderThickness="0,1,0,0">
								<StackPanel Orientation="Horizontal">
									<ContentPresenter
										SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
										VerticalAlignment="Center"/>
									<Control
										SnapsToDevicePixels="false"
										Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}, Path=(Validation.HasError), Converter={StaticResource bool2VisibilityConverter}}"
										Template="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}, Path=ValidationErrorTemplate}" />
								</StackPanel>
							</Border>
						</Themes:DataGridHeaderBorder>
						
						<Thumb x:Name="PART_TopHeaderGripper"
							   VerticalAlignment="Top"
							   Style="{StaticResource RowHeaderGripperStyle}"/>
						<Thumb x:Name="PART_BottomHeaderGripper"
							   VerticalAlignment="Bottom"
							   Style="{StaticResource RowHeaderGripperStyle}"/>
					</Grid>
					<ControlTemplate.Triggers>
						<Trigger Property="IsMouseOver" Value="True">
							<Setter TargetName="headerBorder" Property="Background" 
									Value="{StaticResource HeaderHighlightedBackgoundBrush}" />
						</Trigger>
						<Trigger Property="IsPressed" Value="True">
							<Setter TargetName="headerBorder" Property="Background" 
									Value="{StaticResource HeaderPressedBackgroundBrush}" />
						</Trigger>
					</ControlTemplate.Triggers>
				</ControlTemplate>
			</Setter.Value>
		</Setter>
	</Style>

	<!-- SelectAllButton ControlTemplate -->
	<ControlTemplate x:Key="SelectAllButtonTemplate" TargetType="{x:Type Button}">
		<Grid>
			<Rectangle x:Name="Border" SnapsToDevicePixels="True"
					   Stroke="{StaticResource HeaderBorderBrush}"
					   Fill="{StaticResource HeaderBackgroundBrush}" />
			<Border SnapsToDevicePixels="True" Margin="1,1,1,0"
					BorderBrush="White" BorderThickness="0,1,0,0" />
			<Polygon x:Name="Arrow"
					 HorizontalAlignment="Right"
					 VerticalAlignment="Bottom"
					 Margin="8,8,3,3"
					 Opacity="0.15"
					 Fill="Black"
					 Stretch="Uniform"
					 Points="0,10 10,10 10,0" />
		</Grid>
		<ControlTemplate.Triggers>
			<Trigger Property="IsMouseOver" Value="True">
				<Setter TargetName="Border" Property="Fill"
						Value="{StaticResource HeaderHighlightedBackgoundBrush}" />
			</Trigger>
			<Trigger Property="IsPressed" Value="True">
				<Setter TargetName="Border" Property="Fill"
						Value="{StaticResource HeaderPressedBackgroundBrush}" />
			</Trigger>
			<Trigger Property="IsEnabled" Value="False">
				<Setter TargetName="Arrow" Property="Visibility" Value="Collapsed" />
			</Trigger>
		</ControlTemplate.Triggers>
	</ControlTemplate>
	<!-- DataGrid Style -->
	<Style x:Key="{x:Type DataGrid}" TargetType="{x:Type DataGrid}">
		<Setter Property="Background" Value="{StaticResource DefaultControlBackgroundBrush}"/>
		<Setter Property="Foreground" Value="{StaticResource DefaultControlForegroundBrush}"/>
		<Setter Property="BorderBrush" Value="{StaticResource DefaultControlBorderBrush}" />
		<Setter Property="HorizontalGridLinesBrush" Value="{StaticResource GridLineColorBrush}" />
		<Setter Property="VerticalGridLinesBrush" Value="{StaticResource GridLineColorBrush}" />
		<Setter Property="AlternatingRowBackground" Value="{StaticResource AlternateRowBackgroundBrush}" />
		<Setter Property="ColumnHeaderStyle" Value="{StaticResource ColumnHeaderStyle}"/>
		<Setter Property="BorderThickness" Value="1" />
		<!-- This is needed to force DG to have a non-default value.  Otherwise the DGR.DetailsVisibility cannot have a value of VisibleWhenSelected by default. -->
		<Setter Property="RowDetailsVisibilityMode" Value="VisibleWhenSelected" />
		<Setter Property="ScrollViewer.CanContentScroll" Value="true"/>
		<Setter Property="Template">
			<Setter.Value>
				<ControlTemplate TargetType="{x:Type DataGrid}">
					<Border
						Background="{TemplateBinding Background}"
						BorderBrush="{TemplateBinding BorderBrush}"
						BorderThickness="{TemplateBinding BorderThickness}"
						SnapsToDevicePixels="True"
						Padding="{TemplateBinding Padding}">
						<ScrollViewer Focusable="false" Name="DG_ScrollViewer">
							<ScrollViewer.Template>
								<ControlTemplate TargetType="{x:Type ScrollViewer}">
									<Grid>
										<Grid.RowDefinitions>
											<RowDefinition Height="Auto"/>
											<RowDefinition Height="*"/>
											<RowDefinition Height="Auto"/>
										</Grid.RowDefinitions>

										<Grid.ColumnDefinitions>
											<ColumnDefinition Width="Auto"/>
											<ColumnDefinition Width="*"/>
											<ColumnDefinition Width="Auto"/>
										</Grid.ColumnDefinitions>

										<!--Left Column Header Corner -->
										<Button 
											Command="{x:Static DataGrid.SelectAllCommand}"
											Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=CellsPanelHorizontalOffset}"
											Focusable="false"
											Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=HeadersVisibility, Converter={x:Static DataGrid.HeadersVisibilityConverter}, ConverterParameter={x:Static DataGridHeadersVisibility.All}}" 
											Template="{StaticResource SelectAllButtonTemplate}"/>
										<!--Column Headers-->
										<DataGridColumnHeadersPresenter 
											Grid.Column="1" 
											Name="PART_ColumnHeadersPresenter"
											Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=HeadersVisibility, Converter={x:Static DataGrid.HeadersVisibilityConverter}, ConverterParameter={x:Static DataGridHeadersVisibility.Column}}"/>

										<!--DataGrid content-->
										<ScrollContentPresenter x:Name="PART_ScrollContentPresenter" Grid.Row="1" Grid.ColumnSpan="2" CanContentScroll="{TemplateBinding CanContentScroll}" />

										<ScrollBar
											Grid.Row="0" Grid.RowSpan="2" Grid.Column="2" Name="PART_VerticalScrollBar"
											Orientation="Vertical"
											Maximum="{TemplateBinding ScrollableHeight}"
											ViewportSize="{TemplateBinding ViewportHeight}"
											Value="{Binding Path=VerticalOffset, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}"
											Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}"/>

										<Grid Grid.Row="2" Grid.Column="1">
											<Grid.ColumnDefinitions>
												<ColumnDefinition Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=NonFrozenColumnsViewportHorizontalOffset}"/>
												<ColumnDefinition Width="*"/>
											</Grid.ColumnDefinitions>
											<ScrollBar 
												Grid.Column="1"
												Name="PART_HorizontalScrollBar"
												Orientation="Horizontal"
												Maximum="{TemplateBinding ScrollableWidth}"
												ViewportSize="{TemplateBinding ViewportWidth}"
												Value="{Binding Path=HorizontalOffset, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}"
												Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"/>
										</Grid>
									</Grid>
								</ControlTemplate>
							</ScrollViewer.Template>
							<ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
						</ScrollViewer>
					</Border>
				</ControlTemplate>
			</Setter.Value>
		</Setter>
		<Style.Triggers>
			<Trigger Property="IsGrouping" Value="true">
				<Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
			</Trigger>
		</Style.Triggers>
	</Style>

    <!-- Right Aligned DataGridColumnHeader Style -->
    <Style x:Key="RightAlignedColumnHeaderStyle"
       TargetType="{x:Type DataGridColumnHeader}"
       BasedOn="{StaticResource ColumnHeaderStyle}">
        <Setter Property="HorizontalContentAlignment" Value="Right"/>
    </Style>
    <!-- Center Aligned DataGridColumnHeader Style -->
    <Style x:Key="CenterAlignedColumnHeaderStyle"
       TargetType="{x:Type DataGridColumnHeader}"
       BasedOn="{StaticResource ColumnHeaderStyle}">
        <Setter Property="HorizontalContentAlignment" Value="Center"/>
    </Style>

    <!-- Left Aligned DataGridCell Style -->
    <Style x:Key="LeftAlignedCellStyle" TargetType="{x:Type DataGridCell}" >
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type DataGridCell}">
                    <Grid Background="{TemplateBinding Background}">
                        <ContentPresenter HorizontalAlignment="Left"
                                          VerticalAlignment="Center"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    <!-- Right Aligned DataGridCell Style -->
    <Style x:Key="RightAlignedCellStyle" TargetType="{x:Type DataGridCell}" >
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type DataGridCell}">
                    <Grid Background="{TemplateBinding Background}">
                        <ContentPresenter HorizontalAlignment="Right"
                                          VerticalAlignment="Center"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    <!-- Center Aligned DataGridCell Style -->
    <Style x:Key="CenterAlignedCellStyle" TargetType="{x:Type DataGridCell}" >
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type DataGridCell}">
                    <Grid Background="{TemplateBinding Background}">
                        <ContentPresenter VerticalAlignment="Center"
                                          HorizontalAlignment="Center"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

</ResourceDictionary>